/**
 * @copyright Copyright (c) 2025 Cation. 保留所有权利.
 * @file timing_wheel.h
 * @brief 时间轮调度算法-头文件
 * @version 1.0.0
 * @author Lxh
 * @date 2025-07-27
 * @details 
 * @note 
 * @history
 */

#ifndef __TIMING_WHEEL_H__
#define __TIMING_WHEEL_H__

#pragma once

#include <stdlib.h>
#include <string.h>
#include <stdint.h>

// 平台检测
#if defined(_WIN32) || defined(_WIN64)
#define PLATFORM_WINDOWS 1
#include <windows.h>
#elif defined(__linux__)
#define PLATFORM_LINUX 1
#include <time.h>
#include <unistd.h>
#elif defined(STM32) || defined(__arm__)
#define PLATFORM_EMBEDDED 1
// 嵌入式平台需要提供系统时钟实现
#include "stm32f4xx_hal.h" // 根据实际芯片调整
extern TIM_HandleTypeDef htim1; // 示例定时器
#else
#error "Unsupported platform"
#endif

#ifdef __cplusplus
extern "C" {
#endif

// 定时器节点结构
typedef struct timer_node
{
    void (*callback)(void *arg); // 回调函数
    void *arg;                   // 回调参数
    uint32_t rotation;           // 剩余轮数
    uint32_t slot;               // 所在槽位
    struct timer_node *next;     // 链表指针
} timer_node_t;

// 时间轮结构
typedef struct
{
    timer_node_t *slots[8]; // 槽数组（8槽）
    uint32_t current_slot;  // 当前指针位置
    uint32_t tick_ms;       // 每tick的毫秒数
    uint32_t last_tick;     // 上次tick时间
} timing_wheel_t;

timing_wheel_t *timing_wheel_init(uint32_t tick_ms);
void timing_wheel_add(timing_wheel_t *tw, uint32_t timeout_ms,
                        void (*callback)(void *), void *arg);
void timing_wheel_tick(timing_wheel_t *tw);
void timing_wheel_update(timing_wheel_t *tw);
void timing_wheel_destroy(timing_wheel_t *tw);

#ifdef __cplusplus
}
#endif

#endif /* __TIMING_WHEEL_H__ */